package com.dy.design_pattern_study.interpreter_pattern.dome2;

import com.dy.design_pattern_study.utils.Utils;

import java.util.Optional;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-04-24
 * @Content 抽象解释器
 */
public abstract class Expression {

    public void Interpret(PlayContext context) {
        if (context.getText().length() == 0) {
            return;
        } else {
            //此方法用于将当前的演奏文本第一条命令获得命令和其参数值
            //例子：“O 3 E 0.5 G 0.5 A 3”
            //则 playKey 为 O，而 playValue 为 3
            String playKey = context.getText().substring(0, 1);
            //往后面截取字符串
            context.setText(context.getText().substring(2));

            Double playValue = Double.valueOf(context.getText().substring(0,
                    context.getText().indexOf(" ")));
            Optional<Double> value = Optional.ofNullable(playValue);

            //获得 playKey、playValue之后，需要将其从演奏文本中移除
            //例子：“O 3 E 0.5 G 0.5 A 3”
            //“E 0.5 G 0.5 A 3”
            context.setText(context.getText().substring(
                    context.getText().indexOf(" ") + 1));

            //执行抽象方法，不同的子类有不同的执行处理
            excute(playKey, value.orElse(0d));
        }
    }

    //执行
    public abstract void excute(String key, double value);

    //创建实例 --这个不行，会报错 类转换失败
    public static Expression createInstance(String str){
        String className;
        switch (str){
            case "O":
                className = "Scale";
                break;
            case "T":
                className = "Speed";
                break;
            default:
                className = "Note";
                break;
        }

        Expression expression = Utils.getObject(className);
        return expression;
    }

}
